package cn.bookcycle.paypage.util;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.bookcycle.paypage.constant.BusinessData;
import cn.bookcycle.paypage.constant.Symbol;

/**
 * 操作数据库相关的工具类
 *
 * @author liufenglin
 * @date 2018年3月17日
 */
public class DaoUtil {
	private static final Logger logger = LoggerFactory.getLogger(DaoUtil.class);

	/**
	 * 根据订单ID去修改数据库中该订单的状态
	 * 
	 * @param orderId
	 *            订单ID
	 * @param statusCode
	 *            订单状态 1，未支付；2，已经支付
	 * @return
	 * @throws JSONException
	 */
	public static String modifyOrderStatus(String orderId, int statusCode) throws JSONException {
		/*
		 * 修改订单状态字段分为两步：先根据订单号获取订单的全部信息，然后修改其中的支付状态信息并存入数据库
		 * 之所以这样做，是因为：直接用orderId、orderStatus两个参数去更新数据， 会被数据库认为是要插入数据，起不到更新数据的作用
		 */

		// 根据orderId查找数据
		String data = getOrderByOrderId(orderId);
		// 解析JSONArray格式的数据
		JSONArray jsonArray = new JSONArray(data);
		// 取出json对象给subJsonObject
		JSONObject subJsonObject = jsonArray.getJSONObject(0);
		// 如果订单支付状态不是2（即未支付），则修改subJsonObject的orderStatus属性为2
		if (BusinessData.ORDER_PAID_CODE != subJsonObject.getInt(Symbol.ORDER_STATUS)) {
			// 先移除orderStatus属性
			subJsonObject.remove(Symbol.ORDER_STATUS);
			// 再添加orderStatus属性
			subJsonObject.put(Symbol.ORDER_STATUS, BusinessData.ORDER_PAID_CODE);
		}
		
		// 新建JSONObject，并把请求数据库微服务的所有参数封装其中
		JSONObject jsonObject = new JSONObject();
		// subJsonObject放到jsonObject中
		jsonObject.put(Symbol.DATA, subJsonObject);
		// 指定数据库名
		jsonObject.put(Symbol.DB_NAME, BusinessData.ORDER_DB_NAME);
		// 指定表名
		jsonObject.put(Symbol.TAB_NAME, BusinessData.ORDER_TAB_NAME);
		// 指定update方法
		jsonObject.put(Symbol.METHOD, Symbol.UPDATE);
		// 将josnObject转字符串付给data
		data = jsonObject.toString();
		logger.info("请求修改订单的参数是：{}", data);
		// 向数据库微服务发POST请求
		String result = DBUtil.sendPost(BusinessData.DB_URI, Symbol.DATA, data, Symbol.UTF8);;
		// 把数据库微服务返回的信息返回给该方法的调用者
		return result;
	}

	/**
	 * 通过订单ID获取订单的全部订单信息
	 * 
	 * @param orderId
	 *            订单ID
	 * 
	 * @return JSONArray格式的全部订单信息
	 * @throws JSONException
	 */
	public static String getOrderByOrderId(String orderId) throws JSONException {
		// 将参数封装为JOSNObject
		JSONObject jsonObject = new JSONObject();
		// 指定数据库名
		jsonObject.put(Symbol.DB_NAME, BusinessData.ORDER_DB_NAME);
		// 指定表名
		jsonObject.put(Symbol.TAB_NAME, BusinessData.ORDER_TAB_NAME);
		// 指定查找方法
		jsonObject.put(Symbol.METHOD, Symbol.FIND);
		// 指定要查找的数据，这个数据要封装成subJsonObject参数
		JSONObject subJsonObject = new JSONObject();
		subJsonObject.put(Symbol.ORDER_ID, orderId);
		// subJsonObject放入jsonObject
		jsonObject.put(Symbol.DATA, subJsonObject);
		// 把请求参数转成json格式字符串
		String data = jsonObject.toString();
		logger.info("请求查找订单的参数是：{}", data);
		// 向数据库微服务发送post请求
		String result = DBUtil.sendPost(BusinessData.DB_URI, Symbol.DATA, data, Symbol.UTF8);
		// 返回查找到的数据结果
		return result;
	}
}
